/**
 * @file StarManager.h
 *
 * Odczyt i zapis informacji o gwiazdach - nagłówek.
 *
 * @author Zbigniew Siciarz
 * @date 2009
 * @version 2.0.0
 * @since 2.0.0
 */

#ifndef STARMANAGER_H_
#define STARMANAGER_H_

#include "Observation.h"
#include "Star.h"
#include <QList>
#include <QNetworkAccessManager>
#include <QObject>
#include <QString>


namespace Dogz
{
    /**
     * Odczyt i zapis informacji o gwiazdach.
     *
     * Klasa obsługuje przetwarzanie odpowiedzi z serwerów GCVS i AAVSO,
     * a także lokalną bazę danych SQLite.
     */
    class StarManager : public QObject
    {
        Q_OBJECT

    public:
        StarManager(QObject* parent = 0): QObject(parent), m_netManager(0) {}
        ~StarManager() {}

        /**
         * Nazwy kolumn w tabeli gwiazd, z odpowiadającymi im indeksami.
         */
        enum TableColumns
        {
            Id = 0, Name = 1, Designation = 2, Auid = 3,
            Type = 4, MaxMagnitude = 5, MinMagnitude = 6, Period = 7,
            Epoch = 8
        };

        /**
         * Skąd pobrano gwiazdę?
         */
        enum StarLocation { Database = 0, Network = 1 };

        // obsługa bazy danych
        static void createStarsTable();
        static int addStar(const Star& star);
        static Star getStarFromDatabase(const QString& name);

        // gwiazdy z pliku walidacji
        static void loadValidationFile(const QString& filename);
        static const QStringList& getNames() { return s_starnames; }

        // wyszukiwanie w sieci
        void setNetworkManager(QNetworkAccessManager* mgr)
            { m_netManager = mgr; }
     public slots:
        void getAavsoObservations(QString starName);
        void findStarByName(QString starName, bool useGcvs = true);
    signals:
        void starFound(Dogz::Star star, StarLocation location = Database);
        void gcvsError(QString message);
        void aavsoLookupFinished(QList<Dogz::Observation*> observations);
        void aavsoError(QString message);

    private:
        StarManager(const StarManager&);
        StarManager& operator=(const StarManager&);

        /**
         * Lista nazw gwiazd wyciągnięta z pliku walidacji.
         */
        static QStringList s_starnames;

        /**
         * Zarządzanie połączeniem internetowym.
         */
        QNetworkAccessManager* m_netManager;

        bool isGcvsResponseValid(const QString& html);
        Star parseGcvsResponse(const QString& html);

    private slots:
        void lookupStarInGcvs(QString starName);
        void gcvsReadFinished();
        void aavsoReadFinished();
    };
}

#endif /* STARMANAGER_H_ */
